package cn.csq.threaddemo;

/**
 * @author csq
 * @version 1.0.0
 * @ClassName CreateTheadDemo2.java
 * @Description TODO
 * @createTime 2021年12月07日 22:41:00
 */
public class CreateTheadDemo2 {
    //runnable

    //public class Thread implements Runnable { ... private Runnable target;
    // 执行目标 public void run() { if(this.target != null)
    // { this.target.run(); //调用执行目标的run()方法 } }
    // public Thread(Runnable target) {
    // 包含执行目标的构造器
    // init(null, target, "Thread-" + nextThreadNum(), 0);
    // }
    // }

    //在Thread类的run()方法中，如果target（执行目标）不为空，就执行 target属性的run()方法。而target属性是Thread类的一个实例属性，并且 target属性的类型为Runnable。


    //创建线程的第二种方法就是实现Runnable接口，将需要异步执行的 业务逻辑代码放在Runnable实现类的run()方法中，
    // 将Runnable实例作为 target执行目标传入Thread实例。
    // 该方法的具体步骤如下：
    // （1）定义一个新类实现Runnable接口。
    // （2）实现Runnable接口中的run()抽象方法，将线程代码逻辑存放 在该run()实现版本中。
    // （3）通过Thread类创建线程对象，将Runnable实例作为实际参数传 递给Thread类的构造器，由Thread构造器将该Runnable实例赋值给自己 的target执行目标属性。
    // （4）调用Thread实例的start()方法启动线程。
    // （5）线程启动之后，线程的run()方法将被JVM执行，该run()方法 将调用target属性的run()方法，
    // 从而完成Runnable实现类中业务代码逻辑 的并发执行。


    public static final int MAX = 5;
    static int threadNo = 1;

    static class RunTarget implements Runnable {

        @Override
        public void run() {
            for (int i = 0; i < MAX; i++) {
                System.out.println("i = " + i);
            }
            System.out.println("end");
        }
    }

    public static void main(String[] args) {
        Thread thread = null;
        RunTarget runTarget = new RunTarget();
        for (int i = 0; i < 2; i++) {
            thread = new Thread(runTarget, "RunnableThread" + threadNo);
            thread.start();
        }
    }

}
